from typing import Any

from aiogram import types
from aiogram.types import FSInputFile, InputFile
from aiogram_dialog import Dialog, DialogManager, Window
from aiogram_dialog.widgets.kbd import Back, Button, Cancel, Group, Start
from aiogram_dialog.widgets.text import Const, Format
from sqlalchemy.ext.asyncio import AsyncSession

from app.bot.dialogs.dialog_state import SelectBookSG
from app.database.requests import get_book, search_book


async def set_genre(call: types.CallbackQuery, widget: Any, manager: DialogManager):
    manager.dialog_data["genre_name"] = widget.text.text.lower()
    await manager.switch_to(SelectBookSG.select_level)


async def set_level(call: types.CallbackQuery, widget: Any, manager: DialogManager):
    manager.dialog_data["level"] = widget.widget_id
    await get_new_book(call, widget, manager)
    await manager.switch_to(SelectBookSG.display_books)


async def get_new_book(call: types.CallbackQuery, widget: Any, manager: DialogManager):
    db_session: AsyncSession = manager.middleware_data.get("db_session")
    genre_name = manager.dialog_data.get("genre_name")
    level = manager.dialog_data.get("level")
    book_id = manager.dialog_data.get("book_id")

    book = await search_book(db_session, genre_name, level, book_id)

    await call.message.delete()

    if book:
        manager.dialog_data["book_id"] = book.id
        if book.cover:
            await call.message.answer_photo(
                FSInputFile(book.cover),
                caption=f"<b>{book.name}</b>\n\n{book.description}",
            )
        else:
            await call.message.answer(f"<b>{book.name}</b>\n\n{book.description}")
    else:
        await call.message.answer("У нас пока нет книг по вашим фильтрам 😔")


async def send_book_file(
    call: types.CallbackQuery, widget: Any, manager: DialogManager
):
    db_session: AsyncSession = manager.middleware_data.get("db_session")
    book_id = manager.dialog_data.get("book_id")

    book = await get_book(db_session, book_id)
    await call.message.delete()
    if book:
        if book.file_name:
            await call.answer("Отправляю файл книги")
            await call.message.answer_document(
                FSInputFile(book.file_name),
                caption=book.quote,
            )
        else:
            await call.message.answer("Файл этой книги не найден 😔")
    else:
        await call.message.answer("Такая книга не найдена 😔")
    await manager.done()


select_genre_window = Window(
    Const("Давайте определимся с жанром, который Вам интересен"),
    Group(
        Button(Const("Личная эффективность"), id="1", on_click=set_genre),
        Button(Const("Роман"), id="2", on_click=set_genre),
        Button(Const("Ужасы"), id="3", on_click=set_genre),
        Button(Const("Комедия, юмор"), id="4", on_click=set_genre),
        Button(
            Const("Детская и юношеская, подростковая литература"),
            id="5",
            on_click=set_genre,
        ),
        Button(Const("Детектив"), id="6", on_click=set_genre),
        Button(Const("Фэнтези"), id="7", on_click=set_genre),
        Button(Const("Научная фантастика"), id="8", on_click=set_genre),
        Button(Const("Драма"), id="9", on_click=set_genre),
        width=1,
    ),
    Cancel(Const("⬅️ Назад")),
    state=SelectBookSG.select_genre,
)


select_level_window = Window(
    Const("Отлично! Теперь выберем подходящий уровень"),
    Group(
        Button(Const("A1"), id="A", on_click=set_level),
        Button(Const("A2"), id="A2", on_click=set_level),
        Button(Const("B1"), id="B1", on_click=set_level),
        Button(Const("B2"), id="B2", on_click=set_level),
        Button(Const("C1"), id="C1", on_click=set_level),
        Button(Const("C2"), id="C2", on_click=set_level),
        width=2,
    ),
    Back(Const("⬅️ Назад")),
    state=SelectBookSG.select_level,
)


select_book_window = Window(
    Const(
        "Нажмите <b>Хочу прочитать</b>, чтобы бот отправил файл этой книги\n"
        "Нажмите <b>Следующая книга</b>, чтобы бот отправил другую книгу"
    ),
    Group(
        Button(Const("Хочу прочитать"), id="send_file", on_click=send_book_file),
        Button(Const("Следующая книга"), id="new_book", on_click=get_new_book),
        width=2,
    ),
    Back(Const("⬅️ Назад")),
    Cancel(Const("В главное меню")),
    state=SelectBookSG.display_books,
)


select_book_dialog = Dialog(
    select_genre_window,
    select_level_window,
    select_book_window,
)
